// 不停删除之后剩下的字符串
// 给定一个字符串s1，如果其中含有s2字符串，就删除最左出现的那个
// 删除之后s1剩下的字符重新拼接在一起，再删除最左出现的那个
// 如此周而复始，返回最终剩下的字符串
// 测试链接 : https://www.luogu.com.cn/problem/P4824
// 提交以下的code，可以直接通过

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1000001;
char s1[MAXN], s2[MAXN];
int next[MAXN];
int stack1[MAXN];
int stack2[MAXN];
int size;

void nextArray(int m)
{
    ::next[0] = -1, ::next[1] = 0;
    int i = 2, cn = 0;
    while(i < m)
    {
        if(s2[i - 1] == s2[cn])
            ::next[i++] = ++cn;
        else if(cn > 0)
            cn = ::next[cn];
        else
            ::next[i++] = 0;
    }
}

void compute()
{
    int n = strlen(s1), m = strlen(s2), x = 0, y = 0;
    nextArray(m);
    while(x < n)
    {
        if(s1[x] == s2[y])
        {
            stack1[size] = x;
            stack2[size] = y;
            ++size;
            ++x;
            ++y;
        }
        else if(y == 0)
        {
            // 什么都没有匹配上
            stack1[size] = x;
            stack2[size] = -1;
            ++size;
            ++x;
        }
        else
            y = ::next[y];
        // 相当于栈直接弹出 m 条记录
        if(y == m)
        {
            size -= m;
            y = size > 0 ? (stack2[size - 1] + 1) : 0;
        }
    }
}

int main()
{
    scanf("%s%s", s1, s2);
    compute();
    for(int i = 0; i < size; ++i) putchar(s1[stack1[i]]);

    return 0;
}